// 引用 vscode 本地库
const vscode = require("vscode");
const rs = require("fs");
const path = require("path");

// 获取当前编辑器对象	vscode自带的库
let textEditor = vscode.window.activeTextEditor;
// 当编辑器文本变化时，重置编辑器对象
vscode.window.onDidChangeActiveTextEditor((editor) => (textEditor = editor));

// 激活扩展时调用此方法
function activate (context) {
  // 通过 registerCommand 注册插件 插件名称与package.json中定义的名称匹配
  let disposable = vscode.commands.registerCommand("resty-completion-seprator.completion_seprator", function () {
    textEditor.edit(() => {
      // 当前编辑器的主要选择
      let selection = textEditor.selection;
      // 4.1 获取光标所在行
      let cursor_line = selection.active.line; // activeTextEditor.selection.active {c: 11, e: 39}
      let textObj = textEditor.document.lineAt(cursor_line); // 获取到当前字符串对象

      let contentIndex = textObj.firstNonWhitespaceCharacterIndex; // 获取到当前行内容前置的缩进位置

      let spaceStr = "\n"; // 第二行 前置空格的添加
      for (let i = 0; i < contentIndex; i++) {
        spaceStr += " ";
      }

      let limiter = getLimiter(); // 获取分割符
      let text = "";
      if (limiter == "vue") {
        text = handleVue(textEditor, cursor_line, spaceStr);
      } else {
        // 获取到需要替换的字符串
        text = getTextContent(textObj, limiter, spaceStr);
      }
      let snippetStr = new vscode.SnippetString(text);
      let range = textObj.range; // 当前文字内容的范围
      textEditor.insertSnippet(snippetStr, range);
    });
  });
  context.subscriptions.push(disposable);
}

/**
 * 文字添加分割符方法
 * @param {*} text 需要替换的内容
 * @param {*} limiter 需要添加的分割符
 * @param {*} spaceStr 换行符+第二行的前置空格
 */
function replaceText (text, limiter, spaceStr) {
  // 如果是空字符串 则回车换行
  if (text.trim().length == 0) return text + spaceStr;

  // 包含大括号的语句不做处理
  if (text.includes("{") || text.includes("}")) return text + spaceStr;
  // 不包含分割符
  if (!text.includes(limiter)) {
    if (!text.includes("//")) {
      // 2.1 不包含注释
      return text + limiter + spaceStr;
    } else {
      // 2.2 包含注释
      let textArray = text.trim().split("//");
      // 2.2.1 内容只有两部分
      if (textArray.length == 2) {
        if (textArray[0] == "") {
          // v1.0.3 修正  注释前没有内容时   // let lettext="" 添加缩进的问题。
          return text + spaceStr;
        }
        textArray[0] = textArray[0].replace(/(\s*$)/g, ""); // 去除后面空格
        textArray[1] = textArray[1].replace(/^\s*/, ""); // 去除前面空格
        return textArray[0] + limiter + " // " + textArray[1] + spaceStr;
      } else {
        // 2.2.2 内容有更多的部分

        let first = text.substring(0, text.lastIndexOf("//"));
        first = first.replace(/(\s*$)/g, ""); // 去除后面空格
        let end = text.substring(text.lastIndexOf("//") + 2, text.length);
        end = end.replace(/^\s*/, ""); // 去除前面空格
        return first + limiter + " // " + end + spaceStr;
      }
    }
  } else {
    //如果text包含分割符
    // 1. 需要判定分割符是否在最后
    // v1.0.3 修正 `lettext="";` 分割符在最后,但后面有空格时,还会添加分割符的问题。
    if (text.trim().split("").reverse().join("").indexOf(limiter) == 0) {
      // v1.0.3 修正 for 循环 中 包含分割符的情况下 大括号 去除添加分割符问题。
      return text + spaceStr;
    } else {
      // 包含分割符不在最后
      if (!text.includes("//")) {
        // 2.  不含注释

        return text + limiter + spaceStr;
      } else {
        // 3. 含注释 又包含分割符

        let start = text.substring(0, text.lastIndexOf("//"));
        start = start.replace(/(\s*$)/g, ""); // 去除后面空格
        if (start.split("").reverse().join("").indexOf(limiter) == 0) return text;
        let end = text.substring(text.lastIndexOf("//") + 2, text.length);
        end = end.replace(/^\s*/, ""); // 去除前面空格
        return start + limiter + " // " + end + spaceStr;
      }
    }
  }
}
/**
 * vue处理方法
 * @param {vscode.window.activeTextEditor} editor 当前编辑器
 */
function handleVue (editor, cursor_line, spaceStr) {
  let doc = editor.document;
  let lineCount = doc.lineCount;
  let scr1Line = 0;
  let scr2Line = 0;
  let sty1Line = 0;
  let sty2Line = 0;
  let count = 0;
  for (let i = 0; i < lineCount; i++) {
    if (editor.document.lineAt(i).text.includes("script")) {
      count++;
      if (count % 2 == 1) {
        scr1Line = i;
      } else {
        scr2Line = i;
      }
    }

    if (editor.document.lineAt(i).text.includes("style")) {
      count++;
      if (count % 2 == 1) {
        sty1Line = i;
      } else {
        sty2Line = i;
      }
    }
  }
  let limiter = "";
  let text = doc.lineAt(cursor_line).text;
  if ((cursor_line > scr1Line && cursor_line < scr2Line) || (cursor_line > sty1Line && cursor_line < sty2Line)) {
    limiter = ";";
  }
  return replaceText(text, limiter, spaceStr);
}

/**
 * 根据 limiter 替换文本对象的内容
 * @param {vscode.TextLine} textObj 文本对象
 */
function getTextContent (textObj, limiter, spaceStr) {
  // 获取字符串内容
  let textContent = textObj.text; // 获取当前行的内容
  // 返回更改后字符串内容     // 如果 limter 为 "" 字符串添加换行。 // 如果 limter 不为 "" 字符串根据逻辑添加内容并换行。
  return limiter == "" ? (textContent = textContent + spaceStr) : (textContent = replaceText(textContent, limiter, spaceStr));
}

/**
 * 获取当前文件的分割符 未声明文件返回字符串 ""
 * @returns 根据当前文件的后续,返回不同的分割符
 */
function getLimiter () {
  let limiter = "";
  // 1. 获取当前文件后缀名.
  let docType = textEditor.document.fileName;
  docType = docType.substring(docType.lastIndexOf(".") + 1, docType.length);

  // 2. 获取type.json中是否有对应的分割符.如果有则返回
  let data = rs.readFileSync(path.join(__dirname, "type.json"), { encoding: "utf8" });
  let jsonData = JSON.parse(data);
  for (const key in jsonData) {
    if (docType == key) {
      limiter = docType;
      break;
    }
  }
  console.log(jsonData);
  return docType == "vue" ? "vue" : jsonData[limiter] == undefined ? "" : jsonData[limiter];
}

// 在停用扩展时调用此方法
function deactivate () { }

module.exports = {
  activate,
  deactivate,
};
